#include "MainWindow.h"

extern QSqlDatabase enjoylifedb;
// Cliente
ClientSqlTableModel *client_model;
QTableView *client_view;
QSqlRelationalTableModel *deletedClient_model;
// Autoadministrable
QSqlRelationalTableModel *autoAdmin_model;
QSqlRelationalTableModel  *autoAdminClient_model;
QTableView *autoAdminClient_view;
QSqlRelationalTableModel  *cAutoAdmin_model;
QTableView *cAutoAdmin_view;
// Dominions
QSqlRelationalTableModel *domain_model;
QSqlRelationalTableModel *cDomain_model;
QTableView *cDomain_view;
// Movimientos
QSqlRelationalTableModel *movimientos_model;
QTableView *movimientos_view;
QLineEdit *saldo_line1;
bool movimientosModuleBool;
int movimientosModuleIndex;
// Cheques
ChequeSqlTableModel *cheques_model;
QTableView *cheques_view;
QSqlRelationalTableModel *persona_model;
QSqlRelationalTableModel *concepto_model;
// Vencimientos NIC
QSqlRelationalTableModel *expNIC_model;
QTableView *expNIC_view;
// Gastos Mensuales
QSqlRelationalTableModel *gasto_mes_model;
QTableView *gasto_mes_view;
// Pago Mensual
PMSqlTableModel *pm_model;
QTableView *pm_view;
QTableView *pmCliente_view;
// Cobro Mensual
QSqlRelationalTableModel *cobro_mensual_model;
QTableView *cobro_mensual_view;
// Cuenta Corriente
QSqlRelationalTableModel *cuenta_corriente_model;
QTableView *cuenta_corriente_view;
bool cuentaCorrienteBool;
int cuentaCorrienteModuleIndex;

QTabWidget *tab;

/**
 * @brief MainWindows::MainWindows
 * @param parent
 */

MainWindows::MainWindows(QWidget *parent) :
    QMainWindow(parent)
{
    setWindowTitle("Enjoy Life - Bienvenido");
    showMaximized();
}

/**
 * @brief MainWindows::MainWindows
 * @param parent
 * @param user_
 * @param host_
 * @param port_
 */
MainWindows::MainWindows(QWidget *parent, QString user_, QString host_, int port_) :
    QMainWindow(parent)
{
    clientModuleBool = false;
    domainModuleBool = false;
    autoAdminModuleBool = false;
    //    expirationNICModuleBool = false;
    movimientosModuleBool = false;
    chequesModuleBool = false;
    cuentaCorrienteBool = false;
    gastoMensualBool = false;
    cobroMensualBool = false;
    //    PagoMensualModuleBool = false;

    clientModuleIndex = 0;
    domainModuleIndex = 0;
    autoAdminModuleIndex = 0;
    movimientosModuleIndex = 0;
    chequesModuleIndex = 0;
    cuentaCorrienteModuleIndex = 0;
    gastoMensualModuleIndex = 0;
    cobroMensualModuleIndex = 0;
    //    PagoMensualModuleIndex = 0;

    expNIC_model = new QSqlRelationalTableModel(this,enjoylifedb);
    //
    movimientos_model = new QSqlRelationalTableModel(this,enjoylifedb);
    movimientos_model->setTable("movimiento");
    movimientos_model->setEditStrategy(QSqlRelationalTableModel::OnFieldChange);
    movimientos_view = new QTableView(this);
    setCentralWidget(movimientos_view);
    //
    setWindowIcon(QIcon("://Icons/logo_principal.png"));
    //    setw
    user = user_;
    host = host_;
    port = port_;

    /*
    Botones de la Main Windows
    */
    setWindowFlags(Qt::WindowMinMaxButtonsHint);
    setWindowTitle("Enjoy Life - " + user + "@" + host + ":" + QString::number(port));
    showMaximized();
    setStyleSheet("font: 10pt \"Helvetica57-Condensed\"");
    CreateActions();
    CreateMainMenu();
    qApp->setStyleSheet("QMenuBar::item:selected {background-color: rgb(99,99,99);"
                        "color: rgb(255, 255, 255;border-style: solid)}");

    query = new QSqlQuery(enjoylifedb);

    tab = new QTabWidget(0);
    tab->setMovable(false);
    browser = new Browser(0,QUrl("http://enjoylife.com.ar/"));
    clientModuleBool = true;
    clientModuleIndex = tab->addTab(new ClientModule(this),"Listado Clientes");
    tab->setCurrentIndex(clientModuleIndex);
    tab->setTabIcon(clientModuleIndex,QIcon("://Icons/Tab/clientes2-48.png"));

//    tab->addTab(browser,"Navegador");
//    tab->setTabIcon(0,QIcon("://Icons/Tab/globe2-48.png"));
//    tab->setTabsClosable(true);
//    connect(tab,SIGNAL(tabCloseRequested(int)),this,SLOT(CloseTab(int)));

    /** Barra de herramientas con las opciones para abrir los módulos.
     * Las opciones que contiene son abrir el módulo cliente, el módulo de
     * administraión y la ayuda.
     */
    main_options_toolbar = new CustomToolbar(this);
    CreateMainActions();
    SelectExpiratedDomains2();
    main_options_toolbar->addAction(main_client_action);
    main_options_toolbar->addAction(main_domain_action);
    main_options_toolbar->addAction(main_autoadmin_action);
    //    main_options_toolbar->addAction(main_expirationNIC_action);
    main_options_toolbar->addSeparator();
    main_options_toolbar->addAction(main_movimientos_action);
    main_options_toolbar->addAction(main_cheques_action);
    main_options_toolbar->addAction(main_cuentaCorriente_action);
    main_options_toolbar->addAction(main_cobroMensual_action);
    main_options_toolbar->addSeparator();
    main_options_toolbar->addSeparator();
    main_options_toolbar->addAction(main_gastoMensual_action);
    //    main_options_toolbar->addAction(main_pagoMensual_action);
    main_options_toolbar->addSeparator();
    main_options_toolbar->addSeparator();
    main_options_toolbar->addAction(main_close_action);

    addToolBar(Qt::LeftToolBarArea,main_options_toolbar);

    status = new QStatusBar(this);
    status->setStyleSheet("background-color: rgb(99, 99, 99);color: rgb(255, 255, 255)");
    setStatusBar(status);

    setCentralWidget(tab);

    // Definición de acceso directo para abrir los distintos modulos.
    // F1: Módulo Clientes
    QShortcut* shortcutCl = new QShortcut(QKeySequence("F1"), this);
    connect(shortcutCl, SIGNAL(activated()), this, SLOT(OpenClientModule()));
    // F2: Módulo Dominios.
    QShortcut* shortcutDom = new QShortcut(QKeySequence("F2"), this);
    connect(shortcutDom, SIGNAL(activated()), this, SLOT(OpenDomainsModule()));
    // F3: Módulo Auto Admin.
    QShortcut* shortcutAA = new QShortcut(QKeySequence("F3"), this);
    connect(shortcutAA, SIGNAL(activated()), this, SLOT(OpenAutoAdminmodule()));
    // F4: Módulo Movimientos
    QShortcut* shortcutMov = new QShortcut(QKeySequence("F4"), this);
    connect(shortcutMov, SIGNAL(activated()), this, SLOT(OpenMovimientosModule()));
    // F5: Módulo Cheques
    QShortcut* shortcutCh = new QShortcut(QKeySequence("F5"), this);
    connect(shortcutCh, SIGNAL(activated()), this, SLOT(OpenChequesModule()));
    // F6: Módulo Cta. Cte.
    QShortcut* shortcutCC = new QShortcut(QKeySequence("F6"), this);
    connect(shortcutCC, SIGNAL(activated()), this, SLOT(OpenCuentaCorrienteModule()));
    // F7: Módulo Gasto Mensual
    QShortcut* shortcutGM = new QShortcut(QKeySequence("F7"), this);
    connect(shortcutGM, SIGNAL(activated()), this, SLOT(OpenaGastoMensualModule()));
    // F8: Módulo Cobro Mensual
    QShortcut* shortcutCM = new QShortcut(QKeySequence("F8"), this);
    connect(shortcutCM, SIGNAL(activated()), this, SLOT(OpenCobroMensualModule()));
}

void MainWindows::CreateMainMenu()
{
    // Menu archivo
    file_menu = menuBar()->addMenu("&Archivo");
    file_menu->addAction(backupDB_action);
    file_menu->addAction(restoreDB_action);
    file_menu->addSeparator();
    file_menu->addAction(exit_action);

    //Menu Ayuda
    ayuda_menu = menuBar()->addMenu("&Ayuda");
    ayuda_menu->addAction(listaShorcuts_action);
    ayuda_menu->addSeparator();
    ayuda_menu->addAction(acercaDe_action);

//    // Menu cliente
//    client_menu = menuBar()->addMenu("Cliente");
//    client_menu->setEnabled(false);

//    dominios_menu = menuBar()->addMenu("Dominios");
//    dominios_menu->setEnabled(false);

//    movimintos_menu = menuBar()->addMenu("Movimientos");
}

void MainWindows::CreateActions()
{
    // Acción Crear Backup: crea un backup de la base de datos.
    backupDB_action = new QAction("Exportar Backup",this);
    backupDB_action->setIcon(QIcon("://Icons/DbBackup48.png"));
    backupDB_action->setShortcut(QKeySequence::Save);
    connect(backupDB_action,SIGNAL(triggered()),this,SLOT(BackupDB()));

    // Acción Restaurar Backup: restaura el backup de la base de datos.
    restoreDB_action = new QAction("Importar Backup",this);
    restoreDB_action->setIcon(QIcon("://Icons/DbRestore48.png"));
    restoreDB_action->setShortcut(QKeySequence::Open);
    connect(restoreDB_action,SIGNAL(triggered()),this,SLOT(RestoreDB()));

    // Acción Salir: antes de cerrar la aplicación hace un respaldo de la base de datos.
    exit_action = new QAction("Salir",this);
    exit_action->setIcon(QIcon("://Icons/Salir48.png"));
    exit_action->setShortcut(QKeySequence::Close);
    connect(exit_action,SIGNAL(triggered()),this,SLOT(CloseAndBackup()));

    // Accion Lista de accesos directos.
    listaShorcuts_action = new QAction("Lista de Accesos Rápidos...",this);
    listaShorcuts_action->setIcon(QIcon("://Icons/Shorcuts48.png"));
    listaShorcuts_action->setShortcut(QKeySequence("Ctrl+L"));
    connect(listaShorcuts_action,SIGNAL(triggered()),this,SLOT(ShorcutsList()));

    // Acción Acerca de...
    acercaDe_action = new QAction("Acerca de...",this);
    acercaDe_action->setIcon(QIcon("://Icons/AcercaDe48.png"));
    acercaDe_action->setShortcut(QKeySequence("Ctrl+H"));
//    connect(acercaDe_action,SIGNAL(triggered()),this,SLOT(CloseAndBackup()));
}

void MainWindows::About()
{

}

void MainWindows::ExitApp()
{
    QMessageBox::StandardButton button;
    button = QMessageBox::question(this, "Cerrar",
                                   "¿Está seguro que quiere salir de la aplicación?",
                                   QMessageBox::Yes | QMessageBox::No);

    if (button == QMessageBox::Yes)
        CloseAndBackup();
}

void MainWindows::CloseTab(int index)
{
    if (index == 0)
        return;

    if (index == clientModuleIndex) {
        clientModuleIndex = 0;
        clientModuleBool = false;
    }

    if (index == domainModuleIndex) {
        domainModuleIndex = 0;
        domainModuleBool = false;
    }

    //    if (index == expirationNICModuleIndex) {
    //        expirationNICModuleIndex = 0;
    //        expirationNICModuleBool = false;
    //    }

    if (index == autoAdminModuleIndex) {
        autoAdminModuleIndex = 0;
        autoAdminModuleBool = false;
    }

    if (index == cuentaCorrienteModuleIndex) {
        cuentaCorrienteModuleIndex = 0;
        cuentaCorrienteBool = false;
    }

    if (index == cobroMensualModuleIndex) {
        cobroMensualModuleIndex = 0;
        cobroMensualBool = false;
    }

    if (index == movimientosModuleIndex) {
        movimientosModuleIndex = 0;
        movimientosModuleBool = false;
    }

    if (index == gastoMensualModuleIndex) {
        gastoMensualModuleIndex = 0;
        gastoMensualBool = false;
    }

    if (index == chequesModuleIndex) {
        chequesModuleIndex = 0;
        chequesModuleBool = false;
    }

    //    if (index == PagoMensualModuleIndex) {
    //        PagoMensualModuleIndex = 0;
    //        PagoMensualModuleBool = false;
    //    }

    tab->removeTab(index);
}

void MainWindows::CreateMainActions()
{
    // Acción Clientes: Permite abrir el módulo clientes.
    main_client_action = new QAction("Clientes",this);
    main_client_action->setStatusTip("Se ingresa al módulo clientes");
    main_client_action->setIcon(QIcon("://Icons/BarraLateral/clientes48.png"));
    connect(main_client_action,SIGNAL(triggered()),this,SLOT(OpenClientModule()));

    // Acción Dominios: Permite abrir los dominios de los clientes.
    main_domain_action = new QAction("Dominios",this);
    main_domain_action->setStatusTip("Se ingresa al módulo de dominios de los clientes");
    main_domain_action->setIcon(QIcon("://Icons/BarraLateral/dominios48.png"));
    connect(main_domain_action,SIGNAL(triggered()),this,SLOT(OpenDomainsModule()));

    main_autoadmin_action = new QAction("Autoadmin...",this);
    main_autoadmin_action->setStatusTip("Se ingresa al módulo autoadministrable");
    main_autoadmin_action->setIcon(QIcon("://Icons/BarraLateral/autoadmin48.png"));
    connect(main_autoadmin_action,SIGNAL(triggered()),this,SLOT(OpenAutoAdminmodule()));

    //    main_expirationNIC_action = new QAction("Vtos. NIC",this);
    //    main_expirationNIC_action->setStatusTip("Se ingresa al módulo de vencimientos NIC");
    //    main_expirationNIC_action->setIcon(QIcon("://Icons/BarraLateral/vencimientos48.png"));
    //    connect(main_expirationNIC_action,SIGNAL(triggered()),this,SLOT(OpenExpirationModule()));

    // Acción Movimientos: Permite abrir el modulo de movimientos de dinero
    main_movimientos_action = new QAction("Movimientos",this);
    main_movimientos_action->setStatusTip("Se ingresa al módulo movimientos");
    main_movimientos_action->setIcon(QIcon("://Icons/BarraLateral/movimientos48.png"));
    connect(main_movimientos_action,SIGNAL(triggered()),this,SLOT(OpenMovimientosModule()));

    // Acción Cheques: Permite abrir el modulo cheques a cobrar
    main_cheques_action = new QAction("Cheques",this);
    main_cheques_action->setStatusTip("Se ingresa al módulo cheques a cobrar");
    main_cheques_action->setIcon(QIcon("://Icons/BarraLateral/cheques48.png"));
    connect(main_cheques_action,SIGNAL(triggered()),this,SLOT(OpenChequesModule()));

    // Acción Cuenta Corriente: Permite abrir el modulo Cuenta Corriente
    main_cuentaCorriente_action = new QAction("Cta. Corriente",this);
    main_cuentaCorriente_action->setStatusTip("Se ingresa al módulo Cuenta Corriente");
    main_cuentaCorriente_action->setIcon(QIcon("://Icons/BarraLateral/cuentaCorriente48.png"));
    connect(main_cuentaCorriente_action,SIGNAL(triggered()),this,SLOT(OpenCuentaCorrienteModule()));

    // Acción Gasto Mensual: Permite abrir el modulo Gasto Mensual
    main_gastoMensual_action = new QAction("Gasto Mensual",this);
    main_gastoMensual_action->setStatusTip("Se ingresa al módulo Gasto Mensual");
    main_gastoMensual_action->setIcon(QIcon("://Icons/money_icon&48.png"));
    main_gastoMensual_action->setIcon(QIcon("://Icons/BarraLateral/gastoMensual48.png"));
    connect(main_gastoMensual_action,SIGNAL(triggered()),this,SLOT(OpenaGastoMensualModule()));

    // Acción Cobro Mensual: Permite abrir el modulo Cobro Mensual
    main_cobroMensual_action = new QAction("Cobro Mensual",this);
    main_cobroMensual_action->setStatusTip("Se ingresa al módulo Cobro Mensual");
    main_cobroMensual_action->setIcon(QIcon("://Icons/BarraLateral/cobroMensual48.png"));
    connect(main_cobroMensual_action,SIGNAL(triggered()),this,SLOT(OpenCobroMensualModule()));

    // Acción Pago Mensual: Permite abrir el modulo Pago Mensual
    //    main_pagoMensual_action = new QAction("Pago Mensual",this);
    //    main_pagoMensual_action->setStatusTip("Se ingresa al módulo Pago Mensual");
    //    main_pagoMensual_action->setIcon(QIcon("://Icons/BarraLateral/pagoMensual48.png"));
    //    connect(main_pagoMensual_action,SIGNAL(triggered()),this,SLOT(OpenPagoMensualModule()));

    // Accion Ayuda: Permite obtener ayuda a cerca de como usar el software
    //    main_help_action = new QAction("Ayuda",this);
    //    main_help_action->setShortcut(QKeySequence::HelpContents);
    //    main_help_action->setStatusTip("Brinda la ayuda");
    //    main_help_action->setIcon(QIcon("://Icons/Info.png"));
    //    connect(main_help_action,SIGNAL(triggered()),this,SLOT(Help()));

    // Accion Cerrar: Cierra la aplicación previo respaldo de la base de datos.
    main_close_action = new QAction("Salir",this);
    main_close_action->setStatusTip("Cierra la aplicación");
    main_close_action->setIcon(QIcon("://Icons/BarraLateral/salir48.png"));
    connect(main_close_action,SIGNAL(triggered()),this,SLOT(CloseAndBackup()));
}

void MainWindows::OpenClientModule()
{
    if (!clientModuleBool) {
        clientModuleBool = true;
        if (clientModuleIndex == 0) {
            clientModuleIndex = tab->addTab(new ClientModule(this),"Listado Clientes");
            tab->setCurrentIndex(clientModuleIndex);
            tab->setTabIcon(clientModuleIndex,QIcon("://Icons/Tab/clientes2-48.png"));
        }
    }
    else {
//        if (clientModuleIndex != 0)
            tab->setCurrentIndex(clientModuleIndex);
    }
}

void MainWindows::OpenDomainsModule()
{
    if (!domainModuleBool) {
        domainModuleBool = true;
        if (domainModuleIndex == 0) {
            DomainModule *domain_module = new DomainModule(this);
            //            domain_module->SetDomainMenu(*dominios_menu);
            domainModuleIndex = tab->addTab(domain_module,"Dominios de Clientes");
            tab->setCurrentIndex(domainModuleIndex);
            tab->setTabIcon(domainModuleIndex,QIcon("://Icons/Tab/dominios2-48.png"));
        }
    }
    else {
        if (domainModuleIndex != 0)
            tab->setCurrentIndex(domainModuleIndex);
    }
}

//void MainWindows::OpenExpirationModule()
//{
//    if (!expirationNICModuleBool) {
//        expirationNICModuleBool = true;
//        if (expirationNICModuleIndex == 0) {
//            expirationNICModuleIndex = tab->addTab(new ExpirationNICModule(this),"Vencimientos NIC");
//            tab->setCurrentIndex(expirationNICModuleIndex);
//            tab->setTabIcon(expirationNICModuleIndex,QIcon("://Icons/Tab/vencimientos2-48.png"));
//        }
//    }
//    else {
//        if (expirationNICModuleIndex != 0)
//            tab->setCurrentIndex(expirationNICModuleIndex);
//    }
//}

void MainWindows::OpenAutoAdminmodule()
{
    if (!autoAdminModuleBool) {
        autoAdminModuleBool = true;
        if (autoAdminModuleIndex == 0) {
            autoAdminModuleIndex = tab->addTab(new AutoAdminModule(this),"AutoAdministrables de Clientes");
            tab->setCurrentIndex(autoAdminModuleIndex);
            tab->setTabIcon(autoAdminModuleIndex,QIcon("://Icons/Tab/autoadmin2-48.png"));
        }
    }
    else {
        if (autoAdminModuleIndex != 0)
            tab->setCurrentIndex(autoAdminModuleIndex);
    }
}

void MainWindows::OpenMovimientosModule()
{
    if (!movimientosModuleBool) {
        movimientosModuleBool = true;
        if (movimientosModuleIndex == 0) {
            movimientosModuleIndex = tab->addTab(new MovimientosModule(this),"Movimientos de dinero");
            tab->setCurrentIndex(movimientosModuleIndex);
            tab->setTabIcon(movimientosModuleIndex,QIcon("://Icons/Tab/movimientos2-48.png"));
        }
    }
    else {
        if (movimientosModuleIndex != 0)
            tab->setCurrentIndex(movimientosModuleIndex);
    }
}

void MainWindows::OpenChequesModule()
{
    if (!chequesModuleBool) {
        chequesModuleBool = true;
        if (chequesModuleIndex == 0) {
            chequesModuleIndex = tab->addTab(new ChequesModule(this),"Cheques");
            tab->setCurrentIndex(chequesModuleIndex);
            tab->setTabIcon(chequesModuleIndex,QIcon("://Icons/Tab/cheques2-48.png"));
        }
    }
    else {
        if (chequesModuleIndex != 0)
            tab->setCurrentIndex(chequesModuleIndex);
    }
}

void MainWindows::OpenCuentaCorrienteModule()
{
    if (!cuentaCorrienteBool) {
        cuentaCorrienteBool = true;
        if (cuentaCorrienteModuleIndex == 0) {
            cuentaCorrienteModuleIndex = tab->addTab(new CuentaCorrienteModule(this),"Cuenta Corriente");
            tab->setCurrentIndex(cuentaCorrienteModuleIndex);
            tab->setTabIcon(cuentaCorrienteModuleIndex,QIcon("://Icons/Tab/cuentaCorriente2-48.png"));
        }
    }
    else {
        if (cuentaCorrienteModuleIndex != 0)
            tab->setCurrentIndex(cuentaCorrienteModuleIndex);
    }
}

void MainWindows::OpenaGastoMensualModule()
{
    if (!gastoMensualBool) {
        gastoMensualBool = true;
        if (gastoMensualModuleIndex == 0) {
            gastoMensualModuleIndex = tab->addTab(new GastoMensualModule(this), "Gastos mensuales");
            tab->setCurrentIndex(gastoMensualModuleIndex);
            tab->setTabIcon(gastoMensualModuleIndex,QIcon("://Icons/Tab/gastoMensual2-48.png"));
        }
    }
    else {
        if (gastoMensualModuleIndex != 0)
            tab->setCurrentIndex(gastoMensualModuleIndex);
    }
}

void MainWindows::OpenCobroMensualModule()
{
    if (!cobroMensualBool) {
        cobroMensualBool = true;
        if (cobroMensualModuleIndex == 0) {
            cobroMensualModuleIndex = tab->addTab(new CobroMensualModule(this),"Cobro Mensual");
            tab->setCurrentIndex(cobroMensualModuleIndex);
            tab->setTabIcon(cobroMensualModuleIndex,QIcon("://Icons/Tab/cobroMensual2-48.png"));
        }
    }
    else {
        if (cobroMensualModuleIndex != 0)
            tab->setCurrentIndex(cobroMensualModuleIndex);
    }
}

//void MainWindows::OpenPagoMensualModule()
//{
//    if (!PagoMensualModuleBool) {
//        PagoMensualModuleBool = true;
//        if (PagoMensualModuleIndex == 0) {
//            PagoMensualModuleIndex = tab->addTab(new PagoMensualModule(this), "Pagos mensuales");
//            tab->setCurrentIndex(PagoMensualModuleIndex);
//            tab->setTabIcon(PagoMensualModuleIndex,QIcon("://Icons/Tab/pagoMensual2-48.png"));
//        }
//    }
//    else {
//        if (PagoMensualModuleIndex != 0)
//            tab->setCurrentIndex(PagoMensualModuleIndex);
//    }
//}

/*
 * Acción Salir: antes de cerrar la aplicación hace un respaldo de la base de datos.
 */
void MainWindows::CloseAndBackupModule()
{
    //    exit_action = new QAction("Salir",this);
    //    exit_action->setIcon(QIcon("://Icons/cancelar-32x32.png"));
    //    exit_action->setShortcut(QKeySequence::Close);
    //    exit_action->setStatusTip("Produce la salida del programa");
    //    connect(exit_action,SIGNAL(triggered()),this,SLOT(CloseAndBackup()));
}

void MainWindows::SelectExpiratedDomains2()
{
    QDate date;
    QDate expDate;
    int dia1, dia2;
    int mes1, mes2;
    int anio1, anio2;
    dia1 = date.currentDate().day();
    mes1 = date.currentDate().month();
    anio1 = date.currentDate().year();
    date.setDate(anio1,mes1,dia1);
    dia2 = date.currentDate().addDays(15).day();
    if (dia2 < dia1) {
        mes2 = date.addMonths(1).month();
        if (mes2 < mes1) {
            anio2 =  date.addYears(1).year();
            expDate.setDate(anio2, mes2, dia2);
        }
        else
            expDate.setDate(anio1, mes2, dia2);
    }
    else
        expDate.setDate(anio1, mes1, dia2);

    QString format = "yyyy-MM-dd";
    QString fechaLimite = expDate.toString(format);

    QString filterDomain = "fecha_vencimiento_nic <= '" + fechaLimite + "'";
    expNIC_model->setTable("dominio");
    expNIC_model->setFilter(filterDomain);
    enjoylifedb.transaction();
    if (expNIC_model->select()) {
        if (expNIC_model->rowCount(QModelIndex()) > 0)
            QSound::play("://Music/AlarmaZombie.wav");
        enjoylifedb.commit();
    }
    else {
        enjoylifedb.rollback();
        return;
    }
}

/**
 * @brief MainWindows::CloseAndBackup
 */
void MainWindows::CloseAndBackup()
{
    QMessageBox::StandardButton button;
    button = QMessageBox::question(this, "Cerrar",
                                   "¿Está seguro que quiere salir de la aplicación?",
                                   QMessageBox::Yes | QMessageBox::No);

    if (button == QMessageBox::Yes) {
        QString nombreArchivo = "EnjoyLifeDB-";
        QString usuario = enjoylifedb.userName();
        QDate date;
        QString formatoFecha = "ddMMyyyy";
        QString fecha = date.currentDate().toString(formatoFecha);
        QTime time;
        QString formatoTime = "hhmmss";
        QString hora = time.currentTime().toString(formatoTime);
        QString extension = ".backup";
        QString idArchivo = nombreArchivo + usuario + "-" + fecha + "-" + hora + extension;

        QDir directorio;
        QString dir = directorio.currentPath() + "/BackupDB/AntesDeCerrar/" + usuario + "/" + fecha + "/";
        directorio.setPath(dir);
        QString dirArchivo = directorio.absolutePath() + "/" + idArchivo;

        if (!directorio.exists())
            directorio.mkpath(dir);

        QStringList argumentosDump;
        QProcess *procDump = new QProcess;
        procDump->setProgram("pg_dump");
        argumentosDump << "-U" << "postgres" << "-w" << "-h" << enjoylifedb.hostName() << "-d" << enjoylifedb.databaseName() <<  "-Fc" << "-f" << dirArchivo;
        qDebug() << "Argumentos: " << argumentosDump;

        procDump->setArguments(argumentosDump);
        procDump->execute(procDump->program(), procDump->arguments());

        if (procDump->exitCode() > 1) {
            QMessageBox::critical(this,"Aviso!", tr("Error al intentar respaldar la base de datos. Error: %1").arg(procDump->errorString()));
            return;
        }
        else {
//            QPixmap pixmap("://Images/siti-logo-splash.jpg");
//            QSplashScreen *splash = new QSplashScreen(pixmap);
//            splash->show();
//            splash->showMessage("Creado backup de la base de datos...");

            Splash *sp = new Splash();
            sp->show();

            QTimer::singleShot(2500,sp,SLOT(close()));

            close();
        }
    }
    else
        return;
}

/**
 * @brief MainWindows::BackupDB
 */
void MainWindows::BackupDB()
{
    QString nombreArchivo = "EnjoyLifeDB-";
    QString usuario = enjoylifedb.userName();
    QDate date;
    QString formatoFecha = "ddMMyyyy";
    QString fecha = date.currentDate().toString(formatoFecha);
    QTime time;
    QString formatoTime = "hhmmss";
    QString hora = time.currentTime().toString(formatoTime);
    QString extension = ".backup";
    QString idArchivo = nombreArchivo + usuario + "-" + fecha + "-" + hora + extension;

    QDir directorio;
    QString dir = directorio.homePath() + "/Desktop/";
    QFileDialog fd(this);
    fd.setFileMode(QFileDialog::Directory);
    fd.setOption(QFileDialog::ShowDirsOnly);
    fd.setDirectory(dir);
    fd.setNameFilter("Backup files (*.backup)");
    fd.exec();
    directorio.setPath(fd.directory().absolutePath());
    QString dirArchivo = directorio.absolutePath() + "/" + idArchivo;

    QStringList argumentosDump;
    QProcess *procDump = new QProcess;
    procDump->setProgram("pg_dump");
    argumentosDump << "-U" << "postgres" << "-w" << "-h" << enjoylifedb.hostName() << "-d" << enjoylifedb.databaseName() << "-Fc" << "-f" << dirArchivo;
    procDump->setArguments(argumentosDump);
    procDump->execute(procDump->program(), procDump->arguments());
    if (procDump->exitCode() > 1) {
        QMessageBox::critical(this,"Aviso!", tr("Error al intentar respaldar la base de datos. Error: %1").arg(procDump->errorString()));
        return;
    }

    //    QSplashScreen * splash = new QSplashScreen;
    //    splash->showMessage("Creado respaldo de la base de datos",Qt::AlignCenter);
    //    splash->show();
    //    Sleep(2500);

    //    QMessageBox::information(this,"Exito!", tr("El respaldo de la base de datos se realizó exitosamente!."));
}

/**
 * @brief MainWindows::RestoreDB
 */
void MainWindows::RestoreDB()
{    
    QDir directorio;
    QString dir = directorio.homePath() + "/BackupDB/";
    QFileDialog fd(this);
    QString file = fd.getOpenFileName(this, "Abrir Archivo", dir, "Backup files (*.backup)");

    if (file.isEmpty())
        return;
    else {
        DropTables();
        QStringList argumentosRes;
        QProcess *procRestore = new QProcess;
        procRestore->setProgram("pg_restore");
        argumentosRes << "-U" << "postgres" << "-w" << "-h" << enjoylifedb.hostName() << "-d" << enjoylifedb.databaseName() << file;
        procRestore->setArguments(argumentosRes);
        procRestore->execute(procRestore->program(), procRestore->arguments());
        if (procRestore->exitCode() > 1) {
            QMessageBox::critical(this,"Aviso!", tr("Error al intentar restaurar la base de datos. Error: %1").arg(procRestore->errorString()));
            return;
        }
        QMessageBox::information(this,"Exito!", tr("La restauración de la base de datos fue exitosa!."));

    }
}

/**
 * @brief MainWindows::DropTables
 */
void MainWindows::DropTables()
{
    enjoylifedb.transaction();
    QSqlQuery *query = new QSqlQuery(enjoylifedb);
    if (! query->exec("drop table if exists autoadministrable cascade; "
                      "drop table if exists cheque cascade; "
                      "drop table if exists cliente cascade; "
                      "drop table if exists cliente_eliminado cascade; "
                      "drop table if exists cobro_mensual cascade; "
                      "drop table if exists concepto cascade; "
                      "drop table if exists cuenta_corriente cascade; "
                      "drop table if exists deuda cascade; "
                      "drop table if exists dominio cascade; "
                      "drop table if exists gasto_mes cascade; "
                      "drop table if exists movimiento cascade; "
                      "drop table if exists pago_mensual cascade; "
                      "drop table if exists persona cascade; ")) {
        QString error = query->lastError().text();
        QMessageBox::critical(this,"Error!", tr("Error al intentar al preparar la base de datos "
                                                "para restaurar el backup.").arg(error));
        enjoylifedb.rollback();
        return;
    }
    enjoylifedb.commit();
}

/**
 * @brief MainWindows::ShorcutsList
 */
void MainWindows::ShorcutsList()
{
    AccesosRapidos *ar = new AccesosRapidos();
    ar->show();
}
